#ifndef STEERING_BEHAVIOUR_H
#define STEERING_BEHAVIOUR_H

#include "StringUtility.h"
#include <memory>
#include <algorithm>

namespace Engine
{
	class Agent;
	class Vec3;
	struct SteeringOutput;

	class SteeringBehaviour
	{
		protected:
			Agent* m_parent;
			Agent* m_target;

		public:
			SteeringBehaviour():m_parent(nullptr), m_target(nullptr){}

			virtual ~SteeringBehaviour() = 0 {}
			virtual void Update(SteeringOutput* output) = 0;
			virtual const char* GetTypeName() const = 0;
			virtual unsigned int GetHash() const = 0;
			virtual void SetParent(Agent* parent) {m_parent = parent;}
			virtual void SetTarget(Agent* target) {m_target = target;}

			//for debugging
			virtual void Draw(){}
	};

	typedef std::shared_ptr <SteeringBehaviour> SteeringBehaviourSPtr;
	typedef std::pair <SteeringBehaviour*, float> WeightedSteeringBehaviour;
}

#endif